package com.hhc.service.impl;

import com.hhc.config.JwtConfig;
import com.hhc.dto.LoginRequest;
import com.hhc.dto.RegisterRequest;
import com.hhc.entity.NoticeAnnouncement;
import com.hhc.entity.UserInfo;
import com.hhc.query.NoticeQuery;
import com.hhc.query.UserQuery;
import com.hhc.repository.UserInfoRepository;
import com.hhc.service.AuthService;
import com.hhc.utils.Md5Util;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import com.hhc.utils.RestResult;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

/**
 * 认证服务实现类
 *
 * @author pc
 */
@Service
@RequiredArgsConstructor
public class AuthServiceImpl implements AuthService {

    private static final Logger log = LoggerFactory.getLogger(AuthServiceImpl.class);

    private final UserInfoRepository userInfoRepository;
    private final JwtConfig jwtConfig;

    /**
     * 用户注册
     *
     * @param registerRequest 注册请求参数
     * @return 成功与否
     */
    @Override
    public boolean register(RegisterRequest registerRequest) {
        // 检查用户名是否已存在
        if (userInfoRepository.existsByUsername(registerRequest.getUsername())) {
            log.warn("尝试注册已存在的用户名: {}", registerRequest.getUsername());
            return false;
        }

        // 构建用户实体并保存
        UserInfo user = new UserInfo();
        user.setUsername(registerRequest.getUsername());
        user.setStatus(registerRequest.getStatus());
        user.setPassword(Md5Util.encrypt(registerRequest.getPassword()));
        user.setEmail(registerRequest.getEmail());
        user.setPhone(registerRequest.getPhone());

        try {
            userInfoRepository.save(user);
            log.info("新用户注册成功: {}", registerRequest.getUsername());
            return true;
        } catch (Exception e) {
            log.error("用户注册失败: ", e);
            return false;
        }
    }

    /**
     * 用户登录
     *
     * @param loginRequest 登录请求参数
     * @return 包含token和其他信息的map
     */
    @Override
    public Map<String, Object> login(LoginRequest loginRequest) {
        // 查找用户
        UserInfo user = userInfoRepository.findByUsername(loginRequest.getUsername());
        if (user == null || !Md5Util.encrypt(loginRequest.getPassword()).equals(user.getPassword())) {
            log.warn("无效的用户名或密码: {}", loginRequest.getUsername());
            return null;
        }

        // 生成JWT token
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", user.getId());
        claims.put("username", user.getUsername());

        String token = jwtConfig.generateToken(claims.toString());

        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("userId", user.getId());
        result.put("username", user.getUsername());

        log.info("用户登录成功: {}", loginRequest.getUsername());
        return result;
    }

//    /**
//     * 查询用户列表
//     *
//     * @param query 查询参数
//     * @return RestResult
//     */
//    @Override
//    public RestResult<Object> list(UserQuery query) {
//        try {
//            Pageable pageable = PageRequest.of(query.getCurrentPage()-1, query.getPageSize());
//            Map<String, Object> result = new HashMap<>();
//            result.put("currentPage", query.getCurrentPage());
//            result.put("pageSize", query.getPageSize());
//
//            // 获取所有用户数据
//            Iterable<UserInfo> userInfos =userInfoRepository.findAllUser();
//
//
//            result.put("total", 0); // 实际总数量需要从数据库获取或缓存中读取
//            result.put("data", userInfos);
//            return RestResult.success(result);
//        } catch (Exception e) {
//            log.error("查询用户列表失败", e);
//            return RestResult.failed("查询失败");
//        }
//    }
    /**
     * 查询用户列表（支持条件搜索和分页）
     */
    // 在AuthServiceImpl.java中的list方法中添加参数验证
    @Override
    public RestResult<Object> list(UserQuery query) {
        try {
            // 参数校验和默认值设置
            int currentPage = Math.max(query.getCurrentPage(), 1);
            int pageSize = Math.min(Math.max(query.getPageSize(), 1), 100); // 限制最大页面大小

            // 创建分页条件
            Pageable pageable = PageRequest.of(currentPage - 1, pageSize);

            // 执行条件查询
            Page<UserInfo> userPage = userInfoRepository.findByCondition(
                    query.getUsername(),
                    query.getEmail(),
                    query.getPhone(),
                    pageable
            );

            // 构建返回结果
            Map<String, Object> result = new HashMap<>();
            result.put("currentPage", currentPage);
            result.put("pageSize", pageSize);
            result.put("total", userPage.getTotalElements());
            result.put("data", userPage.getContent());

            return RestResult.success(result);
        } catch (Exception e) {
            log.error("查询用户列表失败", e);
            return RestResult.failed("查询失败");
        }
    }


    /**
     * 更新用户信息
     */
    @Override
    public boolean updateUser(Long id, LoginRequest loginRequest) {
        // 查找用户是否存在
        Optional<UserInfo> userOptional = userInfoRepository.findById(id);
        if (!userOptional.isPresent()) {
            log.warn("更新用户失败，用户不存在: {}", id);
            return false;
        }

        UserInfo user = userOptional.get();

        // 检查用户名是否已被其他用户使用
        if (!user.getUsername().equals(loginRequest.getUsername()) &&
                userInfoRepository.existsByUsername(loginRequest.getUsername())) {
            log.warn("更新用户失败，用户名已存在: {}", loginRequest.getUsername());
            return false;
        }

        // 更新用户信息
        user.setUsername(loginRequest.getUsername());
        if (loginRequest.getPassword() != null && !loginRequest.getPassword().isEmpty()) {
            user.setPassword(Md5Util.encrypt(loginRequest.getPassword()));
        }
        user.setEmail(loginRequest.getEmail());
        user.setPhone(loginRequest.getPhone());
        user.setStatus(loginRequest.getStatus());

        try {
            userInfoRepository.save(user);
            log.info("用户更新成功: {}", id);
            return true;
        } catch (Exception e) {
            log.error("用户更新失败: {}", id, e);
            return false;
        }
    }

    /**
     * 删除用户
     */
    @Override
    public boolean deleteUser(Long id) {
        try {
            // 检查用户是否存在
            if (!userInfoRepository.existsById(id)) {
                log.warn("删除用户失败，用户不存在: {}", id);
                return false;
            }

            userInfoRepository.deleteById(id);
            log.info("用户删除成功: {}", id);
            return true;
        } catch (Exception e) {
            log.error("删除用户失败: {}", id, e);
            return false;
        }
    }
}